home *** CD-ROM | disk | FTP | other *** search
- /* cryptsums.c -- copyright 1992 by C.D.Lane */
-
- #include <c.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdarg.h>
- #include <strings.h>
-
- #include <sys/loader.h>
-
- #include "cryptsum.h"
-
- typedef enum {PROGRAM, FILENAME, PASSWORD, ARGC} ARGUMENTS;
-
- void error_puts(char *string)
- {
- perror(string);
- exit(EXIT_FAILURE);
- }
-
- void error_printf(const char *format, ...)
- {
- va_list ap;
-
- va_start(ap, format); {
- (void) vfprintf(stderr, format, ap);
- } va_end(ap);
-
- exit(EXIT_FAILURE);
- }
-
- void main(int argc, char *argv[])
- {
- FILE *stream;
- char *password;
- unsigned short halfword;
- long l_offset, s_offset;
- unsigned long ncmds, nsects, size;
-
- struct section s_section;
- struct mach_header m_header;
- struct load_command l_command;
- struct segment_command s_command;
-
- if (argc != ARGC) error_printf("Usage: %s Application Password\n", argv[PROGRAM]);
-
- if ((stream = fopen(argv[FILENAME], "r")) == NULL) error_puts("fopen");
- if (fread(&m_header, sizeof(m_header), 1, stream) == 0) error_puts("fread");
- if (m_header.magic != MH_MAGIC) error_printf("Incorrect Mach magic number %x!\n", m_header.magic);
-
- for (ncmds = m_header.ncmds; ncmds > 0; ncmds--) {
- l_offset = ftell(stream);
- if (fread(&l_command, sizeof(l_command), 1, stream) == 0) error_puts("fread");
- if (l_command.cmd == LC_SEGMENT) {
- if (fseek(stream, l_offset, SEEK_SET) == CERROR) error_puts("fseek");
- if (fread(&s_command, sizeof(s_command), 1, stream) == 0) error_puts("fread");
- if (strcmp(s_command.segname, CS_SEGMENT) != 0) {
- for (nsects = s_command.nsects; nsects > 0; nsects--) {
- if (fread(&s_section, sizeof(s_section), 1, stream) == 0) error_puts("fread");
- s_offset = ftell(stream);
- if (fseek(stream, s_section.offset, SEEK_SET) == CERROR) error_puts("fseek");
-
- for (size = 0L, halfword = 0; size < s_section.size; size++)
- halfword = cs_checksum(halfword, getc(stream));
-
- password = cs_cryptkey(argv[PASSWORD], halfword);
-
- (void) printf("%s %s %s\n", s_command.segname, s_section.sectname, password);
-
- if (fseek(stream, s_offset, SEEK_SET) == CERROR) error_puts("fseek");
- }
- }
- }
- if(fseek(stream, l_command.cmdsize + l_offset, SEEK_SET) == CERROR) error_puts("fseek");
- }
- exit(EXIT_SUCCESS);
- }
-